package com.projectframe.base.db.dao;

import java.io.Serializable;
import java.util.Map;

import org.hibernate.SessionFactory;

public interface IBaseDaoCommon
{
    public void registerSessionFactory(SessionFactory sessionFactory);
    
    /**
     * 根據SQL條件與查詢條件, 取得資料 註:只能接受select * from xxx 的方式.
     * 
     * @param sql
     * @param argsMap
     * @param queryObj
     * @param clazz
     *            轉換的物件類型
     * @return
     */
    public <T> T findBySQLWithQueryEntity(final String sql, final Map<?, ?> argsMap,
            final int startRow, final int pageRows, final Class<?> clazz);

    /**
     * 根據SQL條件與查詢條件QueryObject取得資料，前端分頁顯示用
     * 備註：queryObject只負責記錄分頁資訊，參數值都由argsMap取得
     * 
     * @param sql
     * @param argsMap
     * @param queryObj
     * @return
     */
    public <T> T findBySQLWithQueryObject(final String sql, final Map<?, ?> argsMap,
            final int startRow, final int pageRows);

    /**
     * 根據SQL條件與查詢條件QueryObject取得資料，前端分頁顯示用
     * 備註：queryObject只負責記錄分頁資訊，參數值都由argsMap取得
     * 
     * @param sql
     * @param argsMap
     * @param queryObj
     * @param clazz
     *            轉換的物件類型
     * @return
     */
    public <T> T findBySQLWithQueryObject(final String sql, final Map<?, ?> argsMap,
            final int startRow, final int pageRows, final Class<?> clazz);

    /**
     * 根據HQL條件與查詢條件QueryObject取得資料，前端分頁顯示用
     * 備註：queryObject只負責記錄分頁資訊，參數值都由argsMap取得
     * 
     * @param hql
     * @param argsMap
     * @param queryObj
     * @return
     */
    public <T> T findByHQLWithQueryObject(final String hql, final Map<?, ?> argsMap,
                                          final int startRow, final int pageRows);

    public Long getCountByHQL(final String hql, final Map<?, ?> argsMap);

    public Long getCountBySQL(final String sql, final Map<?, ?> argsMap);

    public <T> T insertData(final T model, final boolean flushFlag);
    public <T> T insertData(final T model);

    public <T> T updateData(final T model, final boolean flushFlag);
    public <T> T updateData(final T model);

    public void deleteData(Object model, final boolean flushFlag);
    public void deleteData(Object model);

    public <T> T load(final Class<?> refClass, final Serializable key);
    public <T> T findByPk(final Class<?> refClass, final Serializable key);
    public <T> T findByExample(final Object model);
    public void flushData();
}
